// 提供路由方法的类
#include <iostream>
#include <vector>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include "InetAddr.hpp"
#include "Log.hpp"

namespace wxd
{
    class Route
    {
    private:
        bool IsExist(InetAddrTrans& user)
        {
            for (int i = 0; i < _users.size(); i++)
            {
                if (_users[i] == user)
                {
                    return true;
                }
            }
            return false;
        }

        void Adduser(InetAddrTrans& user)
        {
            LOG(LogLevel::DEBUG)<<"新增一个用户"<<user.Ip()<<":"<<user.Port();
            _users.emplace_back(user);
        }

        void DeleteUser(InetAddrTrans& del_user)
        {
            LOG(LogLevel::DEBUG)<<"用户"<<del_user.Ip()<<":"<<del_user.Port()<<"退出";
            for(auto it = _users.begin();it != _users.end();it++)
            {
                if(*it == del_user)
                {
                    _users.erase(it);
                    break;
                }
            }
        }

    public:
        Route(){};

        void SendAll(int sockfd, InetAddrTrans& user, const std::string& info,const std::string &message)
        {
            
            std::string send_msg = info+message;
            if (!IsExist(user))
                Adduser(user);
            // 发送消息给所有用户
            for (int i = 0; i < _users.size(); i++)
            {

                sockaddr_in user_addr_in = _users[i]();
                socklen_t user_len = sizeof(user_addr_in);
                int send_len = sendto(sockfd, send_msg.c_str(), send_msg.size(), 0, (sockaddr *)&user_addr_in, user_len);
                if (send_len < 0)
                {
                    LOG(LogLevel::ERROR) << "发消息出错！";
                    continue;
                }
                
            }
            //检测是否退出
            if(message == "QUIT")
            {
                DeleteUser(user);
            }
        }

    private:
        std::vector<InetAddrTrans> _users; // 记录所有的用户
    };
}